package ve.gob.cne.to;

import java.io.Serializable;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;

@Entity
@Table(name = "extintor", catalog = "sace")
@SequenceGenerator(name = "seq", initialValue = 00001, allocationSize = 10000)
public class ExtintorTo implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -4170813227623377764L;
	private long id;
	private String codigo;
	private ModeloExtintorTo modelo;
	private PesoTo peso;
	private CompuestoTo compuesto;
	private List<TipoFuegoTo> tipofuegos;
	private TipoUbicacionTo ubicacion;
	private Date ultimoMantenimiento;
	private Date proximoMantenimiento;
	private DependenciaTo ubicacionAdministrativa;
	private SedeTo sede;
	private String area;
	private UsuarioTo responsable;
	private EstadoExtintorTo estadoExtintor;
	private String imagen;
	private boolean alerta;
	private int habilitado;
	private String observacion;
	private boolean reparacion;

	public ExtintorTo() {

	}

	public ExtintorTo(String codigo, ModeloExtintorTo modelo, PesoTo peso,
			CompuestoTo compuesto, List<TipoFuegoTo> tipofuegos,
			TipoUbicacionTo ubicacion, Date ultimoMantenimiento,
			Date proximoMantenimiento, DependenciaTo ubicacionAdministrativa,
			SedeTo sede, String area, UsuarioTo responsable, String imagen,
			EstadoExtintorTo estadoExtintor, String observacion, boolean reparacion) {
		super();
		this.codigo = codigo;
		this.modelo = modelo;
		this.peso = peso;
		this.compuesto = compuesto;
		this.tipofuegos = tipofuegos;
		this.ubicacion = ubicacion;
		this.ultimoMantenimiento = ultimoMantenimiento;
		this.proximoMantenimiento = proximoMantenimiento;
		this.ubicacionAdministrativa = ubicacionAdministrativa;
		this.sede = sede;
		this.area = area;
		this.responsable = responsable;
		this.imagen = imagen;
		this.estadoExtintor = estadoExtintor;
		this.observacion = observacion;
		this.setReparacion(reparacion);
	}

	/**
	 * @return the codigo
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	public long getId() {
		return id;
	}

	/**
	 * @param id
	 *            the id to set
	 */
	public void setId(long id) {
		this.id = id;
	}

	@Column(name = "codigo")
	public String getCodigo() {
		return codigo;
	}

	/**
	 * @param codigo
	 *            the codigo to set
	 */
	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	/**
	 * @return the modelo
	 */

	@ManyToOne(targetEntity = ModeloExtintorTo.class)
	@JoinColumn(name = "fk_modelo", nullable = false)
	public ModeloExtintorTo getModelo() {
		return modelo;
	}

	public void setModelo(ModeloExtintorTo modelo) {
		this.modelo = modelo;
	}

	/**
	 * @return the peso
	 */
	@ManyToOne(targetEntity = PesoTo.class)
	@JoinColumn(name = "fk_peso", nullable = false)
	public PesoTo getPeso() {
		return peso;
	}

	/**
	 * @param peso
	 *            the peso to set
	 */
	public void setPeso(PesoTo peso) {
		this.peso = peso;
	}

	/**
	 * @return the compuestos
	 */
	@ManyToOne(targetEntity = CompuestoTo.class)
	@JoinColumn(name = "compuesto", nullable = false)
	public CompuestoTo getCompuesto() {
		return compuesto;
	}

	/**
	 * @param compuestos
	 *            the compuestos to set
	 * @param compuesto
	 */
	public void setCompuesto(CompuestoTo compuesto) {
		this.compuesto = compuesto;
	}

	/**
	 * @return the fuego
	 */
	@OneToMany(cascade = CascadeType.ALL)
	@JoinTable(name = "extintor_tipo_fuego", joinColumns = @JoinColumn(name = "id_extintor"), inverseJoinColumns = @JoinColumn(name = "id_fuego"))
	public List<TipoFuegoTo> getTipofuegos() {
		return tipofuegos;
	}

	/**
	 * @param tipofuegos
	 *            the tipofuegos to set
	 */
	public void setTipofuegos(List<TipoFuegoTo> tipofuegos) {
		this.tipofuegos = tipofuegos;
	}

	/**
	 * @return the ubicacion
	 */
	@ManyToOne(targetEntity = TipoUbicacionTo.class)
	@JoinColumn(name = "fk_ubicacion", nullable = false)
	public TipoUbicacionTo getUbicacion() {
		return ubicacion;
	}

	/**
	 * @param ubicacion
	 *            the ubicacion to set
	 */
	public void setUbicacion(TipoUbicacionTo ubicacion) {
		this.ubicacion = ubicacion;
	}

	/**
	 * @return the ultimoMantenimiento
	 */
	@Column(name = "ultimo_mantenimiento")
	public Date getUltimoMantenimiento() {
		return ultimoMantenimiento;
	}

	/**
	 * @param ultimoMantenimiento
	 *            the ultimoMantenimiento to set
	 */
	public void setUltimoMantenimiento(Date ultimoMantenimiento) {
		this.ultimoMantenimiento = ultimoMantenimiento;
	}

	@Column(name = "proximo_mantenimiento")
	public Date getProximoMantenimiento() {
		return proximoMantenimiento;
	}

	public void setProximoMantenimiento(Date proximoMantenimiento) {
		this.proximoMantenimiento = proximoMantenimiento;
	}

	/**
	 * @return the ubicacionAdministrativa
	 */
	@ManyToOne(targetEntity = DependenciaTo.class)
	@JoinColumn(name = "fk_dependencia", nullable = false)
	public DependenciaTo getUbicacionAdministrativa() {
		return ubicacionAdministrativa;
	}

	/**
	 * @param ubicacionAdministrativa
	 *            the ubicacionAdministrativa to set
	 */
	public void setUbicacionAdministrativa(DependenciaTo ubicacionAdministrativa) {
		this.ubicacionAdministrativa = ubicacionAdministrativa;
	}

	/**
	 * @return the responsable
	 */
	@ManyToOne(targetEntity = UsuarioTo.class)
	@JoinColumn(name = "fk_usuario", nullable = false)
	public UsuarioTo getResponsable() {
		return responsable;
	}

	/**
	 * @param responsable
	 *            the responsable to set
	 */
	public void setResponsable(UsuarioTo responsable) {
		this.responsable = responsable;
	}

	@ManyToOne(targetEntity = SedeTo.class)
	@JoinColumn(name = "fk_sede", nullable = false)
	public SedeTo getSede() {
		return sede;
	}

	public void setSede(SedeTo sede) {
		this.sede = sede;
	}

	@Column(name = "area")
	public String getArea() {
		return area;
	}

	public void setArea(String area) {
		this.area = area;
	}

	/**
	 * @return the imagen
	 */
	@Column(name = "imagen")
	public String getImagen() {
		return imagen;
	}

	/**
	 * @param imagen
	 *            the imagen to set
	 */
	public void setImagen(String imagen) {
		this.imagen = imagen;
	}

	public boolean isAlerta() {
		return alerta;
	}

	public void setAlerta(boolean alerta) {
		this.alerta = alerta;
	}

	@OneToOne(cascade = CascadeType.ALL, targetEntity = EstadoExtintorTo.class)
	@JoinColumn(name = "fk_estado_extintor", insertable = true)
	public EstadoExtintorTo getEstadoExtintor() {
		return estadoExtintor;
	}

	public void setEstadoExtintor(EstadoExtintorTo estadoExtintor) {
		this.estadoExtintor = estadoExtintor;
	}

	@Column(name = "habilitado")
	public int getHabilitado() {
		return habilitado;
	}

	public void setHabilitado(int habilitado) {
		this.habilitado = habilitado;
	}

	@Column(name = "observacion")
	public String getObservacion() {
		return observacion;
	}

	public void setObservacion(String observacion) {
		this.observacion = observacion;
	}

	@Column(name = "reparacion")
	public boolean isReparacion() {
		return reparacion;
	}

	public void setReparacion(boolean reparacion) {
		this.reparacion = reparacion;
	}
}
